package com.sky.controller.admin;

import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 本地下载
 */
@RestController
@RequestMapping("/admin/common")
@Slf4j
// todo oss菜品图片接口没有实现
public class CommonController1 {
    private static final String FILE_DIRECTORY = "D:\\project\\idea\\Cangqiong_takeout\\nginx-1.20.2\\html\\sky\\img\\img\\";
    private static final String FILE = "http://localhost:80/img/img";

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file){
        log.info("文件上传{}",file);
        if (file.isEmpty()) {
            return Result.success("没有找到上传文件，请选择要上传的文件");
        }
        try {
            byte[] bytes = file.getBytes();

            //file.getOriginalFilename() 是从上传的MultipartFile对象中获取的文件原始名
            File uploadedFile = new File(FILE_DIRECTORY + file.getOriginalFilename());
            //MultipartFile对象的内容传输到之前创建的File对象所表示的文件中
            file.transferTo(uploadedFile);
            return Result.success(FILE+"/"+file.getOriginalFilename());
        } catch (IOException e) {
            e.printStackTrace();
            return Result.error("文件上传失败!");
        }
    }

    /**
     * 文件下载
     * @param fileName
     * @return
     */

//    @GetMapping("/download/{fileName:.+}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {
        //使用Paths.get(FILE_DIRECTORY)获取基础目录的路径。
        //使用resolve(fileName)方法将文件名解析并附加到基础目录上，形成一个完整的文件路径。
        //使用normalize()方法清理路径，例如去除多余的.、..等。
        Path filePath = Paths.get(FILE_DIRECTORY).resolve(fileName).normalize();
        try {
            //创建一个UrlResource对象，该对象封装了文件的URI，用于与Spring框架的文件操作相关功能进行交互。
            //使用resource.exists()检查文件是否存在。
            //使用resource.isReadable()检查文件是否可读。但这里有一个逻辑上的小问题：通常我们会检查&&（两者都满足）而不是||（两者之一满足），
            // 因为即使文件存在但不可读，我们也不能返回它。所以这里的逻辑可能需要修改为resource.exists() && resource.isReadable()。
            Resource resource = new org.springframework.core.io.UrlResource(filePath.toUri());
            if (resource.exists() || resource.isReadable()) {
                //使用ResponseEntity.ok()表示成功的HTTP响应（状态码200）。
                //设置响应的内容类型为APPLICATION_OCTET_STREAM，表示二进制数据，这通常用于文件下载。
                //设置Content-Disposition头部为attachment，这意味着浏览器应该将响应作为文件附件处理，而不是在浏览器中直接显示。同时，通过filename参数指定了下载时的文件名。
                //使用body(resource)将文件内容作为响应体返回。
                return ResponseEntity.ok()
                        .contentType(MediaType.APPLICATION_OCTET_STREAM)
                        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                        .body(resource);
            } else {
                //使用ResponseEntity.notFound()表示资源未找到的HTTP响应（状态码404），并使用build()方法构建并返回这个响应。
                return ResponseEntity.notFound().build();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            return ResponseEntity.status(500).build();
        }
    }

}
